package com.zzq.demo.tio.client;

import com.zzq.demo.tio.client.handler.HelloClientAioHandler;
import com.zzq.demo.tio.client.listener.HelloClientAioListener;
import com.zzq.demo.tio.common.Const;
import org.springframework.stereotype.Component;
import org.tio.client.ClientChannelContext;
import org.tio.client.ClientTioConfig;
import org.tio.client.ReconnConf;
import org.tio.client.TioClient;
import org.tio.client.intf.ClientAioHandler;
import org.tio.client.intf.ClientAioListener;
import org.tio.core.Node;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/**
 * @author : zhaoziqian
 * @description :
 * @date : 2019/10/24 11:01
 */
@Component
public class HelloClient {

    //服务器节点
    public static Node serverNode = new Node(Const.SERVER, Const.PORT);

    //handler, 包括编码、解码、消息处理
    public static ClientAioHandler tioClientHandler = new HelloClientAioHandler();

    //事件监听器，可以为null，但建议自己实现该接口，可以参考showcase了解些接口
    public static ClientAioListener aioListener = new HelloClientAioListener();

    //断链后自动连接的，不想自动连接请设为null
    private static ReconnConf reconnConf = new ReconnConf(5000L);

    //一组连接共用的上下文对象
    public static ClientTioConfig clientTioConfig = new ClientTioConfig(tioClientHandler, aioListener, reconnConf);

    public static TioClient tioClient = null;
    public static ClientChannelContext clientChannelContext = null;

    @PostConstruct
    public void init() throws Exception {
        clientTioConfig.setHeartbeatTimeout(Const.TIMEOUT);
        tioClient = new TioClient(clientTioConfig);
        clientChannelContext = tioClient.connect(serverNode);
    }


    @PreDestroy
    public void destroy() {
        tioClient.stop();
    }
}
